package com.iot.ammeter.mapper.web.user;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.iot.ammeter.dto.web.login.LoginAndRegisterDTO;
import com.iot.ammeter.dto.web.user.WebUserDetailDTO;
import com.iot.ammeter.dto.web.user.WebUserLoginInfoDTO;
import com.iot.ammeter.dto.web.user.WebUserRoleDTO;
import com.iot.ammeter.entity.web.user.WebUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;

/**
 * <p>
 * web端用户表 Mapper 接口
 * </p>
 *
 * @author basil
 * @since 2021-09-25
 */
@Mapper
public interface WebUserMapper extends BaseMapper<WebUser> {

    /**
     * 校验邮箱是否存在
     * 存在返回true，不存在返回false
     *
     * @param email 邮箱号
     * @return boolean
     */
    WebUser emailExists(@Param("email") String email);

    /**
     * 注册一个web用户
     *
     * @param webUserId    web用户id
     * @param emailToDb    web用户邮箱
     * @param passwordToDb web用户密码
     * @return int
     */
    int saveWebUser(@Param("webUserId") String webUserId, @Param("email") String emailToDb, @Param("password") String passwordToDb);

    /**
     * 查询登录密码，返回一个对象
     *
     * @param email 邮箱
     * @return LoginAndRegisterDTO
     */
    LoginAndRegisterDTO selectWebUserByEmail(@Param("email") String email);

    /**
     * 获取用户菜单列表，角色，用户名
     *
     * @param email
     * @return WebUserLoginInfoDTO
     */
    WebUserLoginInfoDTO selectWebUserLoginInfoByEmail(@Param("email") String email);

    /**
     * 修改web端用户密码
     *
     * @param email       邮箱
     * @param newPassword 新密码
     * @return int
     */
    int changeWebUserPassword(@Param("email") String email, @Param("newPassword") String newPassword);

    /**
     * 根据web端用户id获取用户详细信息
     *
     * @param webUserId web端用户id
     * @return WebUserDetailDTO
     */
    WebUserDetailDTO selectWebUserDetailsByWebUserId(@Param("webUserId") String webUserId);

    /**
     * 获取用户列表
     *
     * @param page       分页对象
     * @param userName   用户名
     * @param providerId 服务商id
     * @param roleId     角色id
     * @param isAdmin    是否管理员
     * @return IPage
     */
    IPage<WebUserDetailDTO> selectPage(@Param("page") Page<WebUserDetailDTO> page, @Param("userName") String userName,
                                       @Param("providerId") String providerId, @Param("roleId") String roleId, @Param("isAdmin") Integer isAdmin);

    /**
     * 将web端用户所属服务商插入到数据库表
     *
     * @param id         主键
     * @param webUserId  web端id
     * @param providerId 服务商id
     * @param createTime 创建时间
     * @param updateTime 更新时间
     * @return int 影响行数
     */
    int saveWebUserProvider(@Param("id") String id, @Param("webUserId") String webUserId, @Param("providerId") String providerId,
                            @Param("createTime") LocalDateTime createTime, @Param("updateTime") LocalDateTime updateTime);


    /**
     * 更新用角色
     *
     * @param webUserRole 用户角色
     * @return boolean
     */
    boolean updateWebUserRole(@Param("webUserRole") WebUserRoleDTO webUserRole);
}
